/*
 * ps2_communication.h
 *
 *  Created on: 2025年11月1日
 *      Author: 29795
 */

#ifndef PS2_COMMUNICATION_H_
#define PS2_COMMUNICATION_H_

#include "hal_data.h"

//定义片选、时钟、数据输入、数据输出
#define PS2_CS  BSP_IO_PORT_10_PIN_06
#define PS2_CLK BSP_IO_PORT_05_PIN_08
#define PS2_DI  BSP_IO_PORT_10_PIN_04
#define PS2_DO  BSP_IO_PORT_10_PIN_03

/*
 * ps2_communication.c
 *
 *  Created on: 2025年11月1日
 *      Author: 29795
 */
#include "ps2_communication.h"

//执行片选
void ps2_cs(void);

//取消片选
void ps2_ncs(void);

//时钟下降沿执行
void ps2_clk_down(void);

//时钟上升沿执行
void ps2_clk_up(void);

//读取DI口
uint8_t ps2_read(void);

//写入DO口
void ps2_write(uint8_t data);
//单个字节读写数据
uint8_t ps2_byte(uint8_t data);

//完整PS2通讯流程
void ps2_communication(uint8_t data_array[9]);

//检测是否存在变档
uint8_t ps2_detection(uint8_t data_array[9]);

//flag变换函数
uint8_t ps2_flag_change(uint8_t* byte,uint8_t *ps2_flag, uint8_t mask, uint8_t aim);

//档位变换
void ps2_gear_change(float *aim_data, float gear_step, float max_value);

//获取遥控模式的值
uint8_t ps2_get_remote_control_mode(void);

//基于字节产生速度决策，基于高低4位
void ps2_byte_decision(uint8_t byte, float decision[2], uint8_t is_high);

//基于通讯内容生成决策
void ps2_decision_generation(float decision[2]);


#endif /* PS2_COMMUNICATION_H_ */
